package com.hck.domain.user.service;

import com.hck.api.model.AuthenticateRequestDTO;
import com.hck.api.model.UpdateInfoDTO;
import com.hck.api.model.UpdatePasswordRequestDTO;
import com.hck.domain.user.model.entity.UserEntity;
import com.hck.domain.user.model.valobj.LoginRequest;
import com.hck.domain.user.model.valobj.LoginResult;
import com.hck.domain.user.model.valobj.RegisterRequest;
import com.hck.domain.user.model.valobj.RegisterResult;
import com.hck.domain.user.repository.UserRepository;
import com.hck.types.model.Response;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 用户领域服务
 */
@Slf4j
@Service
public class UserDomainService  {


    private final UserRepository userRepository;

    
    public UserDomainService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    /**
     * 用户登录
     */
    public LoginResult login(LoginRequest loginRequest) {
        // 1. 验证登录参数
        if (!loginRequest.isValid()) {
            return LoginResult.failure("用户名或密码不能为空");
        }
        
        // 2. 根据用户名查找用户
        UserEntity userEntity = userRepository.findByUsername(loginRequest.getUsername());
        if (userEntity == null) {
            return LoginResult.failure("用户不存在");
        }
        
        // 3. 检查用户状态
        if (!userEntity.canLogin()) {
            return LoginResult.failure("用户账号已被禁用");
        }
        
        // 4. 验证密码
        if (!userEntity.validatePassword(loginRequest.getPassword(), userEntity.getPassword())) {
            return LoginResult.failure("密码错误");
        }
        
        // 5. 更新登录信息
        userEntity.updateLoginInfo(loginRequest.getLoginIp());
        userRepository.update(userEntity);
        
        // 6. 生成登录令牌（这里简化处理，实际应该使用JWT等）
        String token = generateToken(userEntity.getId());
        
        // 7. 返回登录成功结果
        return LoginResult.success(userEntity.getId(), userEntity.getUsername(), userEntity.getRealName(),userEntity.getAvatar(), token);
    }
    
    /**
     * 用户注册
     */
    public RegisterResult register(RegisterRequest registerRequest) {
        // 1. 验证注册参数
        if (!registerRequest.isValid()) {
            return RegisterResult.failure(registerRequest.getValidationError());
        }
        
        // 2. 检查用户名是否已存在
        if (userRepository.existsByUsername(registerRequest.getUsername())) {
            return RegisterResult.failure("用户名已存在");
        }
        
        // 3. 检查手机号是否已存在
        if (userRepository.existsByPhone(registerRequest.getPhone())) {
            return RegisterResult.failure("手机号已被注册");
        }
        
        // 4. 检查邮箱是否已存在（如果提供）
        if (registerRequest.getEmail() != null && !registerRequest.getEmail().trim().isEmpty()) {
            if (userRepository.existsByEmail(registerRequest.getEmail())) {
                return RegisterResult.failure("邮箱已被注册");
            }
        }
        
        // 5. 检查身份证号是否已存在（如果提供）
        if (registerRequest.getIdCard() != null && !registerRequest.getIdCard().trim().isEmpty()) {
            if (userRepository.existsByIdCard(registerRequest.getIdCard())) {
                return RegisterResult.failure("身份证号已被注册");
            }
        }
        
        // 6. 创建新用户
        UserEntity newUser = UserEntity.createNewUser(
            registerRequest.getUsername(),
            registerRequest.getPassword(),
            registerRequest.getRealName(),
            registerRequest.getPhone(),
            registerRequest.getEmail(),
            registerRequest.getIdCard(),
            registerRequest.getGender(),
            registerRequest.getBirthDate(),
            registerRequest.getAddress(),
            registerRequest.getEmergencyContact(),
            registerRequest.getEmergencyPhone()
        );
        
        // 7. 保存用户
        userRepository.save(newUser);
        
        // 8. 返回注册成功结果
        return RegisterResult.success(newUser.getId(), newUser.getUsername(), newUser.getRealName());
    }
    
    /**
     * 根据用户ID获取用户信息
     */
    public UserEntity getUserById(Long userId) {

        return userRepository.findById(userId);
    }
    
    /**
     * 生成登录令牌（简化实现）
     */
    private String generateToken(Long userId) {
        // 实际项目中应该使用JWT等安全的令牌生成方式
        return "token_" + userId + "_" + System.currentTimeMillis();
    }

    public boolean authentic(AuthenticateRequestDTO authenticateRequestDTO) {

        return userRepository.authentic(authenticateRequestDTO);
    }

    public boolean updatePassword(UpdatePasswordRequestDTO requestDTO) {
        AuthenticateRequestDTO dto = AuthenticateRequestDTO.builder()
                .password(requestDTO.getOldPassword())
                .userId(requestDTO.getUserId())
                .build();

        boolean result = authentic(dto);
        //原密码错误
        if(!result)
            return false;

        UserEntity userEntity = new UserEntity();
        userEntity.setPassword(requestDTO.getNewPassword());
        userEntity.setId(requestDTO.getUserId());
        userRepository.update(userEntity);

        return true;
    }

    public void update(UpdateInfoDTO dto) {
        UserEntity userEntity = new UserEntity();

        BeanUtils.copyProperties(dto,userEntity);
        log.info("userEntity:"+ userEntity);
        userRepository.update(userEntity);
    }
}